package pers.xiaojun.boot.module.system.dao.mapper.permission;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import pers.xiaojun.boot.module.system.controller.permission.vo.menu.MenuReqVO;
import pers.xiaojun.boot.module.system.dao.entity.permission.MenuDO;

import java.util.Collection;
import java.util.List;

/**
 * 菜单权限数据访问层
 *
 * @author xiaojun
 * @since 2025-10-10
 */
@Mapper
public interface MenuMapper extends BaseMapper<MenuDO> {


    /**
     * 根据父菜单和菜单名称获取菜单
     *
     * @param parentId 父菜单Id
     * @param menuName 菜单名称
     * @return 菜单
     */
    default MenuDO selectByParentIdAndName(Long parentId, String menuName) {
        return this.selectOne(new LambdaQueryWrapper<MenuDO>()
                .eq(MenuDO::getParentId, parentId)
                .eq(MenuDO::getName, menuName)
        );
    }

    /**
     * 根据菜单组件名称获取菜单
     *
     * @param componentName 组件名称
     * @return 菜单
     */
    default MenuDO selectByComponentName(String componentName) {
        return this.selectOne(new LambdaQueryWrapper<MenuDO>()
                .eq(MenuDO::getComponentName, componentName)
        );
    }

    /**
     * 根据父菜单Id查询菜单数量
     *
     * @param parentId 父菜单Id
     * @return 菜单数量
     */
    default Long selectCountByParentId(Long parentId) {
        return this.selectCount(new LambdaQueryWrapper<MenuDO>()
                .eq(MenuDO::getParentId, parentId)
        );
    }

    /**
     * 根据一批父菜单Id查询菜单数量
     *
     * @param parentIds 父菜单Id列表
     * @return 菜单数量
     */
    default Long selectCountByParentIds(List<Long> parentIds) {
        return this.selectCount(new LambdaQueryWrapper<MenuDO>()
                .eq(MenuDO::getParentId, parentIds)
        );
    }


    /**
     * 根据条件查询菜单
     *
     * @param menuReqVO 菜单查询实体
     * @return 菜单列表
     */
    default List<MenuDO> selectListByQuery(MenuReqVO menuReqVO) {
        return selectList(new LambdaQueryWrapper<MenuDO>()
                .like(StrUtil.isNotEmpty(menuReqVO.getName()), MenuDO::getName, menuReqVO.getName())
                .eq(menuReqVO.getStatus() != null, MenuDO::getStatus, menuReqVO.getStatus())
        );
    }

}
